package io.nutz.nutzsite.module.exam.controller;

import io.nutz.nutzsite.common.base.Result;
import io.nutz.nutzsite.common.utils.ShiroUtils;
import io.nutz.nutzsite.module.exam.models.Qdb;
import io.nutz.nutzsite.module.exam.services.QdbService;

import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.nutz.dao.Cnd;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.Strings;
import org.nutz.log.Log;
import org.nutz.log.Logs;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.POST;
import org.nutz.mvc.annotation.Param;
import org.nutz.plugins.slog.annotation.Slog;
/**
 * 题库 信息操作处理
 * 
 * @author lrw
 * @date 2020-04-08
 */
@IocBean
@At("/exam/qdb")
public class QdbController {
	private static final Log log = Logs.get();

	@Inject
	private QdbService qdbService;
	
	@RequiresPermissions("exam:qdb:view")
	@At("")
	@Ok("th:/exam/qdb/qdb.html")
	public void index(HttpServletRequest req) {

	}

	/**
	 * 查询题库列表
	 */
	@At
	@Ok("json")
	@RequiresPermissions("exam:qdb:list")
	public Object list(@Param("name") String name,
			@Param("id") Integer id,
					   @Param("beginTime") Date beginTime,
					   @Param("endTime") Date endTime,
					   HttpServletRequest req) {
		Cnd cnd = Cnd.NEW();
		if (!Strings.isBlank(name)){
			cnd.and("name", "like", "%" + name +"%");
		}
		if(id!=null){
			cnd.and("id", "=", id);
		}
		return qdbService.query(cnd);
	}

	/**
	 * 新增题库
	 */
	@At({"/add/?","/add"})
	@Ok("th:/exam/qdb/add.html")
	public void add(@Param("id") String id, HttpServletRequest req) {
		Qdb qdb = null;
		if(Strings.isNotBlank(id)) {
			qdb = qdbService.fetch(Integer.parseInt(id));
			qdb.setParentName(qdb.getName());
		}
		if (qdb ==null)  {
			qdb=new Qdb();
			qdb.setPid(1);
			qdb.setName("无");
		}
		req.setAttribute("qdb",qdb);
	}

	/**
	 * 新增保存题库
	 */

	@At
	@POST
	@Ok("json")
	@RequiresPermissions("exam:qdb:add")
	@Slog(tag="题库", after="新增保存题库 id=${args[0].id}")
	public Object addDo(@Param("..") Qdb qdb,HttpServletRequest req) {
		try {
			qdb.setCreatedate(new Date());
			qdb.setPoster(ShiroUtils.getSysUserId());
			qdbService.insert(qdb);
			return Result.success("system.success");
		} catch (Exception e) {
			return Result.error("system.error");
		}
	}

	/**
	 * 修改题库
	 */
	@At("/edit/?")
	@Ok("th:/exam/qdb/edit.html")
	public void edit(int id, HttpServletRequest req) {
		Qdb qdb = qdbService.fetch(id);
		if(qdb!=null){
			Qdb parentData = qdbService.fetch(qdb.getPid());
			if (parentData != null) {
				qdb.setParentName( parentData.getName());
			}
		}
		req.setAttribute("qdb",qdb);
	}

	/**
	 * 修改保存题库
	 */
	@At
	@POST
	@Ok("json")
	@RequiresPermissions("exam:qdb:edit")
	@Slog(tag="题库", after="修改保存题库")
	public Object editDo(@Param("..") Qdb qdb,HttpServletRequest req) {
		try {
			if(Lang.isNotEmpty(qdb)){
				qdb.setModifyor(ShiroUtils.getSysUserId());
				qdb.setModifydate(new Date());
				qdbService.updateIgnoreNull(qdb);
			}
			return Result.success("system.success");
		} catch (Exception e) {
			return Result.error("system.error");
		}
	}

	/**
	 * 删除题库
	 */
	@At("/remove/?")
	@Ok("json")
	@RequiresPermissions("exam:qdb:remove")
	@Slog(tag ="题库", after= "删除题库:${args[0]}")
	public Object remove(int id, HttpServletRequest req) {
		try {
			qdbService.delete(id);
			return Result.success("system.success");
		} catch (Exception e) {
			return Result.error("system.error");
		}
	}

	/**
	 * 选择菜单树
	 */
	@At("/selectTree/?")
	@Ok("th:/exam/qdb/tree.html")
	public void selectTree(String id, HttpServletRequest req) {
        Qdb qdb = null;
        if(Strings.isNotBlank(id)) {
            qdb = qdbService.fetch(Integer.parseInt(id));
        }
        if (qdb ==null)  {
            qdb=new Qdb();
            qdb.setId(1);
            qdb.setPid(0);
            qdb.setName("无");
        }
        req.setAttribute("qdb",qdb);
	}

	/**
	* 获取树数据
	* @param parentId
	* @param name
	* @return
	*/
	@At
	@Ok("json")
	public List<Map<String, Object>> treeData( @Param("parentId") String parentId,
											   @Param("name") String name) {
		List<Map<String, Object>> tree = qdbService.selectTree(parentId,name);
		return tree;
	}
    @At
    @POST
    @Ok("json")
    public boolean checkQdbNameUnique(@Param("id") String id,
                                       @Param("parentId") String parentId,
                                       @Param("name") String menuName) {
        return qdbService.checkQdbNameUnique(id, parentId, menuName);
    }
}
